package dao;

import classes.Evento;
import classes.EventoParticipante;
import classes.Imagem;
import classes.Servidor;
import conexao.GerenciadorConexao;
import controlador.LoginControlador;
import erro.ConexaoException;
import erro.ConsultaException;
import gui.EventoMostrar;
import java.io.File;
import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 *
 * @author Roberta
 */
public class EventoDao {

    private GerenciadorConexao g;

    public EventoDao() {
        g = GerenciadorConexao.getInstancia();
    }

    /**
     * 
     * @param e = Evento
     * @param ep = EventoParticipante
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    public void inserirEvento(Evento e, EventoParticipante ep, Imagem im) throws ConexaoException, ConsultaException {
        String sql = "INSERT INTO evento (evento_id,evento,local,data,hora,obs,matricula,status) VALUES (?,?,?,?,?,?,?,?)";
        String sqlEP = "INSERT INTO eventoparticipantes (evento_id,matricula,nome,email) VALUES (?,?,?,?)";
        String sqlImagem = "INSERT INTO imagem (imagem,evento_id,caminho,nome) VALUES (?,?,?,?)";
        List<Servidor> participantes = ep.getParticipante();
        int tamanho = participantes.size();
        try {
            g.connect().setAutoCommit(false);
            PreparedStatement pstmE = (PreparedStatement) g.connect().prepareStatement(sql);
            PreparedStatement pstmEP = (PreparedStatement) g.connect().prepareStatement(sqlEP);
            PreparedStatement pstmImg = (PreparedStatement) g.connect().prepareStatement(sqlImagem);
            Date data = e.getData();
            e.setData(data);
            Date hora = e.getHora();
            e.setHora(hora);
            pstmE.setInt(1, e.getEvento_id());
            pstmE.setString(2, e.getEvento());
            pstmE.setString(3, e.getLocal());
            pstmE.setDate(4, new java.sql.Date(data.getTime()));
            pstmE.setTime(5, new java.sql.Time(hora.getTime()));
            pstmE.setString(6, e.getObs());
            pstmE.setInt(7, e.getLogado().getMatricula());
            pstmE.setInt(8, e.getStatus());
            pstmE.executeUpdate();

            pstmEP.setInt(1, ep.getEvento_id().getEvento_id());
            for (int j = 0; j < tamanho; j++) {
                pstmEP.setInt(2, participantes.get(j).getMatricula());
                pstmEP.setString(3, participantes.get(j).getNome());
                pstmEP.setString(4, participantes.get(j).getEmailProf());
                pstmEP.executeUpdate();
            }
            pstmImg.setBytes(1, im.getImagem());
            pstmImg.setInt(2, im.getIdEvento().getEvento_id());
            pstmImg.setString(3, im.getCaminho());
            pstmImg.setString(4, im.getNome());
            pstmImg.executeUpdate();

            g.connect().commit();
        } catch (SQLException ex) {
            throw new ConsultaException(ex);
        } finally {
            g.disconnect();
        }
    }
    /*  public void inserirEvento(Evento e, EventoParticipante ep) throws ConexaoException, ConsultaException {
    String sql = "INSERT INTO evento (evento_id,evento,local,data,hora,obs,logado,status) VALUES (?,?,?,?,?,?,?,?)";
    String sqlEP = "INSERT INTO eventoparticipantes (codigoEvento,matricula,nome,email) VALUES (?,?,?,?)";
    List<Servidor> participantes = ep.getParticipante();
    int tamanho = participantes.size();
    try {
    g.connect().setAutoCommit(false);
    PreparedStatement pstmE = (PreparedStatement) g.connect().prepareStatement(sql);
    PreparedStatement pstmEP = (PreparedStatement) g.connect().prepareStatement(sqlEP);
    Date data = e.getData();
    e.setData(data);
    Date hora = e.getHora();
    e.setHora(hora);
    pstmE.setInt(1, e.getEvento_id());
    pstmE.setString(2, e.getEvento());
    pstmE.setString(3, e.getLocal());
    pstmE.setDate(4, new java.sql.Date(data.getTime()));
    pstmE.setTime(5, new java.sql.Time(hora.getTime()));
    pstmE.setString(6, e.getObs());
    pstmE.setInt(7, e.getLogado().getMatricula());
    pstmE.setInt(8, e.getStatus());
    pstmE.executeUpdate();
    pstmEP.setInt(1, ep.getEvento_id().getEvento_id());
    for (int j = 0; j < tamanho; j++) {
    pstmEP.setInt(2, participantes.get(j).getMatricula());
    pstmEP.setString(3, participantes.get(j).getNome());
    pstmEP.setString(4, participantes.get(j).getEmailProf());
    pstmEP.executeUpdate();
    }
    g.connect().commit();
    } catch (SQLException ex) {
    throw new ConsultaException(ex);
    } finally {
    g.disconnect();
    }
    }*/

    /**
     * 
     * @param e = Evento
     * @return
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    public Evento consultarid(Evento e) throws ConexaoException, ConsultaException {
        String sql = "SELECT evento_id FROM evento ORDER BY evento_id DESC LIMIT 1";

        try {
            PreparedStatement pstm = g.connect().prepareStatement(sql);
            ResultSet rs = pstm.executeQuery();
            if (rs.next()) {
                e.setEvento_id(rs.getInt("evento_id"));
            }
        } catch (SQLException ex) {
            throw new ConsultaException(ex);
        } finally {
            g.disconnect();
        }
        return e;
    }

    /**
     * 
     * @return
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    public List<Evento> listar() throws ConexaoException, ConsultaException {
        List<Evento> lista = new ArrayList<Evento>();
        Evento e;
        String sql = "SELECT evento_id,evento,local,data,obs,hora,status FROM evento order by data asc";
        try {
            Statement stm = (Statement) g.connect().createStatement();
            ResultSet rs = stm.executeQuery(sql);

            while (rs.next()) {
                e = new Evento();
                e.setEvento_id(rs.getInt("evento_id"));
                e.setEvento(rs.getString("evento"));
                e.setLocal(rs.getString("local"));
                e.setData(rs.getDate("data"));
                e.setObs(rs.getString("obs"));
                e.setHora(rs.getTime("hora"));
                e.setStatus(rs.getInt("status"));
                lista.add(e);
            }
        } catch (SQLException ex) {
            throw new ConsultaException(ex);
        } finally {
            g.disconnect();
        }
        return lista;
    }

    /**
     * 
     * @return
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    public List<Evento> listarAbertos() throws ConexaoException, ConsultaException {
        List<Evento> lista = new ArrayList<Evento>();
        Evento e;
        String sql = "SELECT evento_id,evento,local,data,obs,hora,status FROM evento WHERE status=1 order by data asc";
        try {
            Statement stm = (Statement) g.connect().createStatement();
            ResultSet rs = stm.executeQuery(sql);

            while (rs.next()) {
                e = new Evento();
                e.setEvento_id(rs.getInt("evento_id"));
                e.setEvento(rs.getString("evento"));
                e.setLocal(rs.getString("local"));
                e.setData(rs.getDate("data"));
                e.setObs(rs.getString("obs"));
                e.setHora(rs.getTime("hora"));
                e.setStatus(rs.getInt("status"));
                lista.add(e);
            }
        } catch (SQLException ex) {
            throw new ConsultaException(ex);
        } finally {
            g.disconnect();
        }
        return lista;
    }

    /**
     * 
     * @return
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    public List<Evento> listarLogado() throws ConexaoException, ConsultaException {
        List<Evento> lista = new ArrayList<Evento>();
        Evento e = new Evento();
        String lc = LoginControlador.login;
        Servidor s = new Servidor();
        ServidorDao sdao = new ServidorDao();
        s.setLogin(lc);
        sdao.pesquisarLogin(s);
        e.setLogado(s);
        String sql = "SELECT evento_id,evento,local,data,obs,hora,status FROM evento WHERE matricula=? order by data asc";
        try {
            PreparedStatement pstm = g.connect().prepareStatement(sql);
            pstm.setInt(1, e.getLogado().getMatricula());
            ResultSet rs = pstm.executeQuery();

            while (rs.next()) {
                e = new Evento();
                e.setEvento_id(rs.getInt("evento_id"));
                e.setEvento(rs.getString("evento"));
                e.setLocal(rs.getString("local"));
                e.setData(rs.getDate("data"));
                e.setObs(rs.getString("obs"));
                e.setHora(rs.getTime("hora"));
                e.setStatus(rs.getInt("status"));
                lista.add(e);
            }
        } catch (SQLException ex) {
            throw new ConsultaException(ex);
        } finally {
            g.disconnect();
        }
        return lista;
    }

    /**
     * 
     * @return
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    public List<Evento> listarEncerrados() throws ConexaoException, ConsultaException {
        List<Evento> lista = new ArrayList<Evento>();
        Evento e;
        String sql = "SELECT evento_id,evento,local,data,obs,hora,status FROM evento WHERE status=2 order by data asc";
        try {
            Statement stm = (Statement) g.connect().createStatement();
            ResultSet rs = stm.executeQuery(sql);

            while (rs.next()) {
                e = new Evento();
                e.setEvento_id(rs.getInt("evento_id"));
                e.setEvento(rs.getString("evento"));
                e.setLocal(rs.getString("local"));
                e.setData(rs.getDate("data"));
                e.setObs(rs.getString("obs"));
                e.setHora(rs.getTime("hora"));
                e.setStatus(rs.getInt("status"));
                lista.add(e);

            }
        } catch (SQLException ex) {
            throw new ConsultaException(ex);
        } finally {
            g.disconnect();
        }
        return lista;
    }

    /**
     * 
     * @return
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    public List<Evento> listarParticipo() throws ConexaoException, ConsultaException {
        List<Evento> lista = new ArrayList<Evento>();
        Evento e = new Evento();
        EventoParticipante ep = new EventoParticipante();
        String lc = LoginControlador.login;
        Servidor s = new Servidor();
        ServidorDao sdao = new ServidorDao();
        s.setLogin(lc);
        sdao.pesquisarLogin(s);
        e.setLogado(s);
        String sql = "SELECT ep.matricula,ep.evento_id,e.* "
                + "FROM evento as e,eventoparticipantes as ep "
                + "WHERE ep.matricula=? "
                + "AND ep.evento_id=e.evento_id";
        try {
            PreparedStatement pstm = g.connect().prepareStatement(sql);
            pstm.setInt(1, e.getLogado().getMatricula());
            ResultSet rs = pstm.executeQuery();

            while (rs.next()) {
                e = new Evento();
                e.setEvento_id(rs.getInt("e.evento_id"));
                e.setEvento(rs.getString("e.evento"));
                e.setLocal(rs.getString("e.local"));
                e.setData(rs.getDate("e.data"));
                e.setObs(rs.getString("e.obs"));
                e.setHora(rs.getTime("e.hora"));
                e.setStatus(rs.getInt("e.status"));
                lista.add(e);
            }
        } catch (SQLException ex) {
            throw new ConsultaException(ex);
        } finally {
            g.disconnect();
        }
        return lista;
    }

    /**
     * 
     * @return
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    public List<EventoParticipante> listarP() throws ConexaoException, ConsultaException {
        String sql = "SELECT s.nomeExibido,ep.evento_id,ep.participantes_id,ep.nome,e.evento_id "
                + "FROM eventoparticipantes ep, evento e, servidor s "
                + "WHERE  e.evento_id=ep.evento_id "
                + "AND s.matricula = ep.matricula "
                + "AND e.evento_id=?";
        EventoParticipante ep;
        Evento evento;
        List<EventoParticipante> lista = new ArrayList<EventoParticipante>();
        try {
            PreparedStatement pstm = g.connect().prepareStatement(sql);
            pstm.setInt(1, EventoParticipante.id_evento);
            ResultSet rs = pstm.executeQuery();
            while (rs.next()) {
                evento = new Evento();
                ep = new EventoParticipante();
                evento.setEvento_id(rs.getInt("ep.evento_id"));
                ep.setEventoP_id(rs.getInt("ep.participantes_id"));
                ep.setEvento_id(evento);
                ep.setNome(rs.getString("s.nomeExibido"));
                lista.add(ep);
            }
        } catch (SQLException ex) {
            throw new ConsultaException(ex);
        } finally {
            g.disconnect();
        }
        return lista;
    }

    /**
     * 
     * @return
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    public List<EventoParticipante> listarEP(Evento e) throws ConexaoException, ConsultaException {
        String sql = "SELECT ep.evento_id,ep.participantes_id,ep.nome,e.evento_id "
                + "FROM eventoparticipantes as ep INNER JOIN evento as e "
                + "ON  e.evento_id=ep.evento_id "
                + "AND e.evento_id=? ORDER BY ep.nome ASC";
        EventoParticipante ep = null;
        Evento evento;
        List<EventoParticipante> lista = new ArrayList<EventoParticipante>();
        try {
            PreparedStatement pstm = g.connect().prepareStatement(sql);
            pstm.setInt(1, e.getEvento_id());
            ResultSet rs = pstm.executeQuery();
            while (rs.next()) {
                evento = new Evento();
                ep = new EventoParticipante();
                evento.setEvento_id(rs.getInt("ep.evento_id"));
                ep.setEventoP_id(rs.getInt("ep.participantes_id"));
                ep.setEvento_id(evento);
                ep.setNome(rs.getString("ep.nome"));
                lista.add(ep);
            }
        } catch (SQLException ex) {
            throw new ConsultaException(ex);
        } finally {
            g.disconnect();
        }
        return lista;
    }

    public List<Servidor> listarEPS(Evento e) throws ConexaoException, ConsultaException {
        String sql = "SELECT ep.nome,ep.matricula,s.nomeExibido "
                + "FROM eventoparticipantes as ep,evento as e, servidor s "
                + "WHERE e.evento_id=ep.evento_id "
                + "AND s.matricula = ep.matricula "
                + "AND e.evento_id=? ORDER BY ep.nome ASC";
        Servidor s;
        ArrayList<Servidor> servidor = new ArrayList<Servidor>();
        try {
            PreparedStatement pstm = g.connect().prepareStatement(sql);
            pstm.setInt(1, e.getEvento_id());
            ResultSet rs = pstm.executeQuery();
            while (rs.next()) {
                s = new Servidor();
                s.setMatricula(rs.getInt("ep.matricula"));
                s.setNome(rs.getString("ep.nome"));
                s.setNomeExibicao(rs.getString("s.nomeExibido"));
                servidor.add(s);
            }
        } catch (SQLException ex) {
            throw new ConsultaException(ex);
        } finally {
            g.disconnect();
        }
        return servidor;
    }

    /**
     * 
     * @param e = Evento
     * @return
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    public Evento pesquisar(Evento e) throws ConexaoException, ConsultaException {

        String sql = "SELECT * FROM evento WHERE evento_id=?";
        try {
            PreparedStatement pstm = g.connect().prepareStatement(sql);
            pstm.setInt(1, e.getEvento_id());
            ResultSet rs = pstm.executeQuery();
            if (rs.next()) {
                e.setEvento_id(rs.getInt("evento_id"));
                e.setEvento(rs.getString("evento"));
                e.setObs(rs.getString("obs"));
                e.setData(rs.getDate("data"));
                e.setHora(rs.getTime("hora"));
                e.setLocal(rs.getString("local"));
                e.setStatus(rs.getInt("status"));
            }
        } catch (SQLException ex) {
            throw new ConsultaException(ex);
        } finally {
            g.disconnect();
        }
        return e;
    }

    public Imagem pesquisar(Evento e, Imagem img) throws ConexaoException, ConsultaException {

        String sql = "SELECT i.evento_id, i.imagem, i.caminho, i.nome,e.evento_id "
                + "FROM evento as e, imagem as i "
                + "WHERE e.evento_id = i.evento_id AND e.evento_id=?";
        try {
            PreparedStatement pstm = g.connect().prepareStatement(sql);
            pstm.setInt(1, e.getEvento_id());
            ResultSet rs = pstm.executeQuery();
            if (rs.next()) {
                e.setEvento_id(rs.getInt("i.evento_id"));
                img.setIdEvento(e);
                java.sql.Blob blob = rs.getBlob("i.imagem");
                if (blob != null) {
                    byte[] array = blob.getBytes(1, (int) blob.length());
                    img.setImagem(array);
                } else {
                    img = new Imagem();
                }
                img.setCaminho(rs.getString("i.caminho"));
                img.setNome(rs.getString("i.nome"));
            }
        } catch (SQLException ex) {
            throw new ConsultaException(ex);
        } finally {
            g.disconnect();
        }
        return img;
    }

    /**
     * 
     * @param e = Evento
     * @param ep = EventoParticipante
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    public void deletarEvento(Evento e, EventoParticipante ep, Imagem img) throws ConexaoException, ConsultaException {

        String sql = "DELETE FROM evento WHERE evento_id =?";
        String sqlEP = "DELETE FROM eventoparticipantes WHERE evento_id=?";
        String sqlImg = "DELETE FROM imagem WHERE evento_id = ?";
        try {
            g.connect().setAutoCommit(false);
            PreparedStatement pstmEp = (PreparedStatement) g.connect().prepareStatement(sqlEP);
            PreparedStatement pstm = (PreparedStatement) g.connect().prepareStatement(sql);
            PreparedStatement pstmImg = (PreparedStatement) g.connect().prepareStatement(sqlImg);

            pstmEp.setInt(1, EventoMostrar.id);
            pstmEp.executeUpdate();

            pstm.setInt(1, e.getEvento_id());
            pstm.executeUpdate();

            pstmImg.setInt(1, EventoMostrar.id);
            pstmImg.executeUpdate();

            g.connect().commit();

        } catch (SQLException ex) {
            throw new ConsultaException(ex);
        } finally {
            g.disconnect();
        }
    }

    /**
     * 
     * @param e = Evento
     * @param ep = EventoParticipante
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    public void alterarEvento(Evento e, EventoParticipante ep, Imagem img) throws ConexaoException, ConsultaException {
        String sql = "UPDATE evento SET evento=?,local=?,obs=?,data=?,hora=?,status=? WHERE evento_id=?";
        String sqlTs = "INSERT INTO eventoparticipantes (evento_id,matricula,nome,email) VALUES (?,?,?,?)";
        String sqlD = "DELETE FROM eventoparticipantes WHERE evento_id=?";
        String sqlImg = "UPDATE imagem SET imagem=?,caminho=?,nome=? WHERE evento_id = ?";
        List<Servidor> listaS = ep.getParticipante();
        int size = listaS.size();
        try {
            g.connect().setAutoCommit(false);
            PreparedStatement pstm = (PreparedStatement) g.connect().prepareStatement(sql);
            PreparedStatement pstmEP = (PreparedStatement) g.connect().prepareStatement(sqlTs);
            PreparedStatement pstmD = (PreparedStatement) g.connect().prepareStatement(sqlD);
            PreparedStatement pstmImg = (PreparedStatement) g.connect().prepareStatement(sqlImg);

            pstm.setString(1, e.getEvento());
            pstm.setString(2, e.getLocal());
            pstm.setString(3, e.getObs());
            pstm.setDate(4, new java.sql.Date(e.getData().getTime()));
            pstm.setTime(5, new java.sql.Time(e.getHora().getTime()));
            pstm.setInt(6, e.getStatus());
            pstm.setInt(7, e.getEvento_id());
            pstm.executeUpdate();

            pstmD.setInt(1, ep.getEvento_id().getEvento_id());
            pstmD.executeUpdate();

            pstmEP.setInt(1, ep.getEvento_id().getEvento_id());
            for (int i = 0; i < size; i++) {
                pstmEP.setInt(2, listaS.get(i).getMatricula());
                pstmEP.setString(3, listaS.get(i).getNome());
                pstmEP.setString(4, listaS.get(i).getEmailProf());
                pstmEP.executeUpdate();
            }

            pstmImg.setBytes(1, img.getImagem());
            pstmImg.setString(2, img.getCaminho());
            pstmImg.setString(3, img.getNome());
            pstmImg.setInt(4, img.getIdEvento().getEvento_id());
            pstmImg.executeUpdate();

            g.connect().commit();
        } catch (SQLException ex) {
            throw new ConsultaException(ex);
        } finally {
            g.disconnect();
        }
    }

    /**
     * 
     * @param e = Evento
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    public void alterar(Evento e) throws ConexaoException, ConsultaException {

        String sql = "UPDATE evento SET evento=?,local=?,obs=?,data=?,hora=? WHERE evento_id=?";
        try {
            PreparedStatement pstm = (PreparedStatement) g.connect().prepareStatement(sql);

            pstm.setString(1, e.getEvento());
            pstm.setString(2, e.getLocal());
            pstm.setString(3, e.getObs());
            pstm.setDate(4, new java.sql.Date(e.getData().getTime()));
            pstm.setTime(5, new java.sql.Time(e.getHora().getTime()));

            pstm.setInt(6, e.getEvento_id());
            pstm.executeUpdate();
        } catch (SQLException ex) {
            throw new ConsultaException(ex);
        } finally {
            g.disconnect();
        }
    }

    public void alterarAberto(Evento e) throws ConexaoException, ConsultaException {
        String sql = "UPDATE evento SET status=? WHERE evento_id=?";
        try {
            PreparedStatement pstm = (PreparedStatement) g.connect().prepareStatement(sql);

            pstm.setInt(1, e.getStatus());

            pstm.setInt(2, e.getEvento_id());
            pstm.executeUpdate();
        } catch (SQLException ex) {
            throw new ConsultaException(ex);
        } finally {
            g.disconnect();
        }
    }

    public void insertIcone() throws IOException, ConexaoException, SQLException {
        String sql = "insert into icone (icone) values(?)";
        Imagem imagem = new Imagem();
        File fileImagem = new File("D:/Roberta/Projetos_SVN/Akese_SGA/trunk/src/Imagens/tasks.png", "");
        byte[] bImg = imagem.retornaBytesArquivo(fileImagem);
        PreparedStatement pstm = (PreparedStatement) g.connect().prepareStatement(sql);
        pstm.setBytes(1, bImg);
        pstm.executeUpdate();
    }

    public Imagem pesquisarIcone() throws ConexaoException, ConsultaException {
        Imagem img = new Imagem();
        String sql = "SELECT * "
                + "FROM icone as i "
                + "WHERE idicone = 2";
        try {
            PreparedStatement pstm = g.connect().prepareStatement(sql);
            ResultSet rs = pstm.executeQuery();
            if (rs.next()) {
                java.sql.Blob blob = rs.getBlob("i.icone");
                if (blob != null) {
                    byte[] array = blob.getBytes(1, (int) blob.length());
                    img.setImagem(array);
                } else {
                    img = new Imagem();
                }
            }
        } catch (SQLException ex) {
            throw new ConsultaException(ex);
        } finally {
            g.disconnect();
        }
        return img;
    }
}
